/******************** 
 * author:叶帅鑫
 * Date of production:2024.10.21
 * 
 * 输入命令说明:
 * add：添加学生信息。
 * sort_id：按学号排序。
 * sort_course：按某门课程成绩排序（需要输入课程编号）。
 * sort_total：按总成绩排序。
 * stats：统计某门课程的成绩（需要输入课程编号）。
 * print：打印所有学生信息。
 * quit：退出程序。
*************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>  // 用于检查学号是否为数字

// 学生、课程容量
#define MAX_STUDENTS 32  // 学生数量
#define MAX_COURSES 3    // 课程数量

// 分数段--记录五个分数段：<60, 60-69, 70-79, 80-89, >=90
#define SCORE_FAIL 60
#define SCORE_PASS_LOW 70
#define SCORE_PASS_HIGH 80
#define SCORE_GOOD 90

// 定义学生结构体
typedef struct {
    char id[10];          // 学号
    char name[50];        // 姓名
    float scores[MAX_COURSES];  // 每门课程的成绩
    float total_score;    // 总成绩
} Student;

// 声明学生数组
Student students[MAX_STUDENTS];
int student_count = 0;  // 当前学生数量
char course_names[MAX_COURSES][50]; // 课程名称

// 函数声明
void add_students(void);    //增加学生信息
void sort_by_id(void);      //按学号排序
void sort_by_course(int course_index);  //按某门成绩排序
void sort_by_total_score(void);             //按总成绩排序
void calculate_statistics(int course_index);    //统计学生成绩
void print_students(void);  //显示学生信息
void show_help(void);       // 显示帮助信息
void edit_student(void);    // 编辑学生信息
int is_number(const char *str);

// 主函数
int main(void) 
{
    char command[20];

    // 输入课程名称
    for (int i = 0; i < MAX_COURSES; i++) 
    {
        printf("请输入第%d门课程的名称: ", i + 1);
        scanf("%s", course_names[i]);
    }

    printf("欢迎使用燕山大学学生成绩管理系统！\n");
    show_help();

    while (1) 
    {
        printf("\n请输入命令: ");
        scanf("%s", command);

        if (strcmp(command, "add") == 0) 
        {
            add_students();
        } 
        else if (strcmp(command, "sort_id") == 0) 
        {
            sort_by_id();
        } 
        else if (strcmp(command, "sort_course") == 0) 
        {
            int course_index;
            printf("请输入要按哪门课程排序（0-%d）：", MAX_COURSES - 1);
            scanf("%d", &course_index);
            sort_by_course(course_index);
        }
        else if (strcmp(command, "sort_total") == 0) 
        {
            sort_by_total_score();
        } 
        else if (strcmp(command, "stats") == 0) 
        {
            int course_index;
            printf("请输入要统计哪门课程成绩（0-%d）：", MAX_COURSES - 1);
            scanf("%d", &course_index);
            calculate_statistics(course_index);
        }
        else if (strcmp(command, "print") == 0) 
        {
            sort_by_id();
        } 
        else if (strcmp(command, "edit") == 0) 
        {
            edit_student();
        }
        else if (strcmp(command, "help") == 0) 
        {
            show_help();
        }
        else if (strcmp(command, "quit") == 0) 
        {
            break;
        } 
        else 
        {
            printf("无效的命令，请重新输入。\n");
        }
    }

    return 0;
}

// 显示帮助信息
void show_help(void)
{
    printf("本系统支持以下命令：\n");
    printf("1. add - 添加学生信息\n");
    printf("2. sort_id - 按学号排序\n");
    printf("3. sort_course - 按某门课程成绩排序\n");
    printf("4. sort_total - 按总成绩排序\n");
    printf("5. stats - 统计单科成绩\n");
    printf("6. print - 显示所有学生信息\n");
    printf("7. edit - 修改学生信息\n");
    printf("8. help - 显示命令列表\n");
    printf("9. quit - 退出系统\n");
}

// 检查输入的字符串是否全为数字
int is_number(const char *str) 
{
    for (int i = 0; str[i] != '\0'; i++) 
    {
        if (!isdigit(str[i])) 
        {
            return 0;
        }
    }
    return 1;
}

// 添加学生信息
void add_students(void) 
{
    char continue_add[10]; // 用于存储用户是否继续添加的输入

    do 
    {
        if (student_count >= MAX_STUDENTS) 
        {
            printf("学生数量已达到最大限制。\n");
            return;
        }

        // 输入并验证学号
        while (1) 
        {
            printf("请输入学生学号: ");
            scanf("%s", students[student_count].id);

            // 检查学号是否为数字
            if (!is_number(students[student_count].id)) 
            {
                printf("学号无效！请重新输入数字学号。\n");
                continue;
            }

            // 检查学号是否重复
            int duplicate_found = 0;
            for (int i = 0; i < student_count; i++) 
            {
                if (strcmp(students[i].id, students[student_count].id) == 0) 
                {
                    duplicate_found = 1;
                    break;
                }
            }

            if (duplicate_found) 
            {
                printf("学号 %s 已存在，请重新输入。\n", students[student_count].id);
            } 
            else 
            {
                break; // 学号有效且不重复，跳出循环
            }
        }

        printf("请输入学生姓名: ");
        scanf("%s", students[student_count].name);
        students[student_count].total_score = 0;

        // 输入并验证每门课程的成绩
        for (int i = 0; i < MAX_COURSES; i++) 
        {
            while (1) 
            {
                // 修改提示，使用课程名称
                printf("请输入%s的成绩（0-100）: ", course_names[i]);
                scanf("%f", &students[student_count].scores[i]);
                if (students[student_count].scores[i] < 0 || students[student_count].scores[i] > 100) 
                {
                    printf("成绩无效！请输入 0 到 100 之间的分数。\n");
                } 
                else 
                {
                    break;
                }
            }
            students[student_count].total_score += students[student_count].scores[i];
        }

        student_count++;
        printf("学生信息录入成功！\n");

        // 询问是否继续添加学生信息
        printf("是否继续添加学生信息（yes or no）: ");
        scanf("%s", continue_add);

    } 
    while (strcmp(continue_add, "yes") == 0);

    printf("已结束添加学生信息。\n");
}



// 编辑学生信息
void edit_student(void) 
{
    char id[10];
    int found = 0;

    printf("请输入要修改的学生学号: ");
    scanf("%s", id);

    for (int i = 0; i < student_count; i++) 
    {
        if (strcmp(students[i].id, id) == 0) 
        {
            found = 1;
            printf("找到学生 %s 的信息，输入新姓名和成绩:\n", students[i].name);
            printf("请输入新姓名: ");
            scanf("%s", students[i].name);
            
            for (int j = 0; j < MAX_COURSES; j++) 
            {
                while (1) 
                {
                    // 修改提示，使用课程名称
                    printf("请输入%s的新成绩（0-100）: ", course_names[j]);
                    scanf("%f", &students[i].scores[j]);
                    if (students[i].scores[j] < 0 || students[i].scores[j] > 100) 
                    {
                        printf("成绩无效！请输入 0 到 100 之间的分数。\n");
                    } 
                    else 
                    {
                        // 更新总成绩
                        students[i].total_score = 0; // 重新计算总成绩
                        for (int k = 0; k < MAX_COURSES; k++) {
                            students[i].total_score += students[i].scores[k];
                        }
                        break;
                    }
                }
            }

            printf("学生信息修改成功！\n");
            break;
        }
    }

    if (!found) 
    {
        printf("未找到学号为 %s 的学生。\n", id);
    }
}

// 按学号排序
void sort_by_id(void) 
{
    // --选择排序
    for (int i = 0; i < student_count - 1; i++) 
    {
        for (int j = i + 1; j < student_count; j++) 
        {
            if (strcmp(students[i].id, students[j].id) > 0) 
            {
                Student temp = students[i];
                students[i] = students[j];
                students[j] = temp;
            }
        }
    }
    printf("按学号排序成功！\n");
    print_students();
}

// 按某门课程成绩排序
void sort_by_course(int course_index) 
{
    if (course_index < 0 || course_index >= MAX_COURSES) 
    {
        printf("无效的课程索引。\n");
        return;
    }

    // --选择排序
    for (int i = 0; i < student_count - 1; i++) 
    {
        for (int j = i + 1; j < student_count; j++) 
        {
            if (students[i].scores[course_index] < students[j].scores[course_index]) 
            {
                Student temp = students[i];
                students[i] = students[j];
                students[j] = temp;
            }
        }
    }
    printf("按%s成绩排序成功！\n", course_names[course_index]);
    print_students();
}

// 按总成绩排序
void sort_by_total_score(void) 
{
    // --选择排序
    for (int i = 0; i < student_count - 1; i++) 
    {
        for (int j = i + 1; j < student_count; j++) 
        {
            if (students[i].total_score < students[j].total_score) 
            {
                Student temp = students[i];
                students[i] = students[j];
                students[j] = temp;
            }
        }
    }
    printf("按总成绩排序成功！\n");
    print_students();
}

// 统计单科成绩
void calculate_statistics(int course_index) 
{
    if (course_index < 0 || course_index >= MAX_COURSES) 
    {
        printf("无效的课程索引。\n");
        return;
    }

    int fail_count = 0, pass_low_count = 0, pass_high_count = 0, good_count = 0;
    
    for (int i = 0; i < student_count; i++) 
    {
        if (students[i].scores[course_index] < SCORE_FAIL) 
        {
            fail_count++;
        } 
        else if (students[i].scores[course_index] < SCORE_PASS_LOW) 
        {
            pass_low_count++;
        } 
        else if (students[i].scores[course_index] < SCORE_PASS_HIGH) 
        {
            pass_high_count++;
        } 
        else 
        {
            good_count++;
        }
    }

    printf("%s统计结果：\n", course_names[course_index]);
    printf("不及格人数：%d\n", fail_count);
    printf("及格人数（60-69）：%d\n", pass_low_count);
    printf("良好人数（70-79）：%d\n", pass_high_count);
    printf("优秀人数（>=90）：%d\n", good_count);
}

// 显示学生信息
void print_students(void) 
{
    printf("学号\t姓名\t");
    for (int i = 0; i < MAX_COURSES; i++) 
    {
        printf("%s\t", course_names[i]);
    }
    printf("总成绩\n");

    for (int i = 0; i < student_count; i++) 
    {
        printf("%s\t%s\t", students[i].id, students[i].name);
        for (int j = 0; j < MAX_COURSES; j++) 
        {
            printf("%.2f\t", students[i].scores[j]);
        }
        printf("%.2f\n", students[i].total_score);
    }
}

